package go_service

import (
	"fmt"
	"os"
)

// Service 表示一个Linux服务
type Service struct {
	Name          string   // 服务名称
	Description   string   // 服务描述
	ExecPath      string   // 可执行文件路径
	Args          []string // 命令行参数
	WorkingDir    string   // 工作目录
	Env           []string // 环境变量
	User          string   // 运行用户
	Group         string   // 运行用户组
	AutoStart     bool     // 是否开机启动
	StartType     string   // 启动类型: simple, forking, oneshot, dbus, notify, idle
	RestartPolicy string   // 重启策略: no, always, on-success, on-failure, on-abnormal, on-watchdog, on-abort
	WantedBy      string   // 目标单元，默认为 multi-user.target
	After         []string // 依赖的服务
	Requires      []string // 必需的服务
}

// NewService 创建一个新的服务实例
//
// 参数:
//
//	name: 服务名称，必须是有效的Linux服务名称（例如: "nginx", "mysql-server"）
//	description: 服务描述，用于Systemd服务文件的Description字段（例如: "Nginx Web Server"）
//	execPath: 可执行文件的完整路径（例如: "/usr/local/bin/myapp", "/usr/sbin/nginx"）
//
// 返回值:
//
//	*Service: 初始化的服务实例，包含默认配置
//	error: 如果当前用户没有root权限则返回错误，否则返回nil
//
// 示例:
//
//	service, err := NewService("my-web-server", "My Web Application", "/usr/local/bin/myapp")
//	if err != nil {
//		fmt.Printf("创建服务失败: %v\n", err)
//		return
//	}
//	service.Args = []string{"--config", "/etc/myapp/config.yaml"}
//	service.AutoStart = true
func NewService(name, description, execPath string) (*Service, error) {
	// 检查是否具有root权限
	if err := checkRootPermission(); err != nil {
		return nil, err
	}

	return &Service{
		Name:          name,
		Description:   description,
		ExecPath:      execPath,
		Args:          []string{},
		WorkingDir:    ".",
		Env:           os.Environ(),
		User:          "",
		Group:         "",
		AutoStart:     true,
		StartType:     "simple",
		RestartPolicy: "on-failure",
		WantedBy:      "multi-user.target",
		After:         []string{},
		Requires:      []string{},
	}, nil
}

// checkRootPermission 检查当前用户是否具有root权限
//
// 返回值:
//
//	error: 如果没有root权限返回错误，有权限返回nil
func checkRootPermission() error {
	// 在Unix系统中，root用户的UID为0
	// 在Windows中，管理员权限的检查方式不同
	// 这里使用跨平台的方式检查文件权限
	testFile := "/etc/systemd/system/test-permission-check.service"

	// 尝试在systemd目录创建测试文件
	file, err := os.OpenFile(testFile, os.O_CREATE|os.O_WRONLY|os.O_EXCL, 0644)
	if err != nil {
		if os.IsPermission(err) {
			return fmt.Errorf("当前用户没有root权限，无法创建systemd服务: %v", err)
		}
		return fmt.Errorf("检查权限时发生错误: %v", err)
	}

	// 清理测试文件
	file.Close()
	os.Remove(testFile)

	return nil
}
